const jscodeshift = require('jscodeshift');
const espree = require('espree');
const eslintScope = require('eslint-scope');
const recast = require('recast');
const fs = require('fs');

// 原始代码
const code = `
  function test() {
    let test = 1;
    function inner() {
      console.log(test);
    }
  }
`;

// 解析代码生成 AST
// 配置 espree 的解析选项
const ast = espree.parse(code, {
    ecmaVersion: 2020,  // 支持最新 ECMAScript 版本
    sourceType: 'module', // 如果是模块的话
    range: true,         // 保持 range 属性，eslint-scope 需要这个属性
    loc: true            // 保持位置信息（可选）
});
// const ast = recast.parse(code,{ ranges: true, ecmaVersion: 2020 });
// const ast = recast.parse(code, {parser: require('recast/parsers/babel')});


// 使用 eslint-scope 进行作用域分析
const scopeManager = eslintScope.analyze(ast,{ecmaVersion: 2020});

// 获取最外层的函数作用域

const functionNode = ast.body.find(node => node.type === 'FunctionDeclaration');
// const functionScope = scopeManager.acquire(functionNode); // 获取函数作用域
const functionScope = scopeManager.acquire(ast); // 获取函数作用域

// 查找并修改函数名，但不影响内部变量 'test'
if (functionScope) {
    functionScope.variables.forEach(variable => {
        if (variable.name === 'test') {
            // 只修改函数定义，不修改变量定义
            variable.identifiers.forEach(identifier => {

                if (identifier.parent.type === 'FunctionDeclaration') {
                    identifier.name = 'renamedTest';
                }
            });
        }
    });

    // 生成修改后的代码
    const output = recast.print(ast).code;
    console.log(output);
}
